/***************************************************************
 * Name:      keytables.cpp
 * Purpose:   Code for SketchUp Ruby Extension EventRelay
 * Author:    pecan Heber
 * Created:   2008/10/21
 * Copyright: pecan Heber
 * License:   GPL
 **************************************************************/
/*
	This file is part of Eventrelay, a Ruby extension for SketchUp
	Copyright (C) 2008,2009 Pecan Heber

	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
// ----------------------------------------------------------------------------
//  keytables.cpp
// ----------------------------------------------------------------------------
// RCS-ID: $Id: keytables.cpp 19 2007-01-26 02:23:50Z Pecan $

#if defined(__WXMSW__)
 // headers for MSW here
     #ifdef wxUSE_UNICODE
        #define UNICODE
        #define _UNICODE   // Yes, we need to define both for wx2.8.0
    #endif
    #include <windows.h>

#else //define(__WXGTK__)
 // headers for *NIX here
    //#include <X11/Xlibint.h>
    //#include <X11/Xlib.h>
    //#include <X11/Xutil.h>
    //#include <X11/cursorfont.h>
    #include <X11/keysymdef.h>
    #include <X11/keysym.h>
    #include <X11/extensions/XTest.h>
    // <wx/layout.h> and <X11/extensions/XI.h> both have "Abolute" defined
    #undef Absolute
#endif  //else (__WXGTK__)

#include <wx/msgdlg.h>
#include "debugging.h"
#include "keytables.h"

class KeyTables;

   // -----------------------
   // Define KeyTables
   // -----------------------
    KeyTables keyTables;

// ----------------------------------------------------------------------------
//  __WXMSW__ Windows keytables
// ----------------------------------------------------------------------------
#if defined (__WXMSW__)
// ----------------------------------------------------------------------------
//  keytables.cpp
// ----------------------------------------------------------------------------
#include <wx/window.h>
// ----------------------------------------------------------------------------
KeyTables::~KeyTables() {;}
// ----------------------------------------------------------------------------
KeyTables::KeyTables()
// ----------------------------------------------------------------------------
{
    // Named Macro Table
    wsMacTable.Add(wxT("ALT"));     wsMacTable.Add(wxT("BACKSPACE"));  wsMacTable.Add(wxT("BS"));     wsMacTable.Add(wxT("DEL"));
    wsMacTable.Add(wxT("DELETE"));  wsMacTable.Add(wxT("DOWN"));       wsMacTable.Add(wxT("END"));    wsMacTable.Add(wxT("ENTER"));
    wsMacTable.Add(wxT("ESC"));     wsMacTable.Add(wxT("ESCAPE"));     wsMacTable.Add(wxT("F1"));     wsMacTable.Add(wxT("F2"));
    wsMacTable.Add(wxT("F3"));      wsMacTable.Add(wxT("F4"));         wsMacTable.Add(wxT("F5"));     wsMacTable.Add(wxT("F6"));
    wsMacTable.Add(wxT("F7"));      wsMacTable.Add(wxT("F8"));         wsMacTable.Add(wxT("F9"));     wsMacTable.Add(wxT("F10"));
    wsMacTable.Add(wxT("F11"));     wsMacTable.Add(wxT("F12"));        wsMacTable.Add(wxT("HOME"));   wsMacTable.Add(wxT("INS"));
    wsMacTable.Add(wxT("INSERT"));  wsMacTable.Add(wxT("LEFT"));       wsMacTable.Add(wxT("PGDN"));   wsMacTable.Add(wxT("PGUP"));
    wsMacTable.Add(wxT("RIGHT"));   wsMacTable.Add(wxT("SPACE"));      wsMacTable.Add(wxT("TAB"));    wsMacTable.Add(wxT("UP"));
    wsMacTable.Add(wxT("PRINTSCREEN"));wsMacTable.Add(wxT("LWIN"));    wsMacTable.Add(wxT("RWIN"));   wsMacTable.Add(wxT("SCROLLLOCK"));
    wsMacTable.Add(wxT("NUMLOCK"));  wsMacTable.Add(wxT("CTRLBREAK")); wsMacTable.Add(wxT("PAUSE"));  wsMacTable.Add(wxT("CAPSLOCK"));
    wsMacTable.Add(wxT("NUMPAD0"));  wsMacTable.Add(wxT("NUMPAD1"));   wsMacTable.Add(wxT("NUMPAD2"));wsMacTable.Add(wxT("NUMPAD3"));
    wsMacTable.Add(wxT("NUMPAD4"));  wsMacTable.Add(wxT("NUMPAD5"));   wsMacTable.Add(wxT("NUMPAD6"));wsMacTable.Add(wxT("NUMPAD7"));
	wsMacTable.Add(wxT("NUMPAD8"));  wsMacTable.Add(wxT("NUMPAD9"));   wsMacTable.Add(wxT("NUMPADMULT"));wsMacTable.Add(wxT("NUMPADADD"));
	wsMacTable.Add(wxT("NUMPADSUB"));wsMacTable.Add(wxT("NUMPADDOT")); wsMacTable.Add(wxT("NUMPADDIV"));wsMacTable.Add(wxT("MENU"));
	wsMacTable.Add(wxT("LCTRL"));    wsMacTable.Add(wxT("RCTRL"));     wsMacTable.Add(wxT("LALT"));   wsMacTable.Add(wxT("RALT"));
	wsMacTable.Add(wxT("LSHIFT"));   wsMacTable.Add(wxT("RSHIFT"));    wsMacTable.Add(wxT("SLEEP"));  wsMacTable.Add(wxT("NUMPADENTER"));
    wsMacTable.Add(wxT("CTRLDOWN")); wsMacTable.Add(wxT("CTRLUP"));	   wsMacTable.Add(wxT("ALTDOWN"));wsMacTable.Add(wxT("ALTUP"));
	wsMacTable.Add(wxT("SHIFTDOWN"));wsMacTable.Add(wxT("SHIFTUP"));   wsMacTable.Add(wxT("ASC"));    wsMacTable.Add(wxT("WAIT"));
	wsMacTable.Add(wxT("LBUTTON"));  wsMacTable.Add(wxT("MBUTTON"));   wsMacTable.Add(wxT("RBUTTON"));
    wsMacTable.Add(wxT("SHIFT"));    wsMacTable.Add(wxT("MENU"));      wsMacTable.Add(wxT("CONTROL"));

	int wsCmtTableEntryCount = wsMacTable.GetCount();

    // Command Type: The following must be in the same order as the character MacTable above
	wnMacType.Add( USR_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( USR_KEYSYM);
	wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM);
	wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM); wnMacType.Add( USR_KEYSYM);
	wnMacType.Add( VK_MOUSESYM);wnMacType.Add( VK_MOUSESYM);wnMacType.Add( VK_MOUSESYM);
	wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM); wnMacType.Add( VKB_KEYSYM);

    #if defined(LOGGING)
	int wnMacTypeEntryCount = wnMacType.GetCount();
	#endif

    // Key Codes: The following must be in the same order as the MacTable

	wnKeyCode.Add( ALT);        wnKeyCode.Add( VK_BACK);    wnKeyCode.Add( VK_BACK);    wnKeyCode.Add( VK_DELETE);
	wnKeyCode.Add( VK_DELETE);  wnKeyCode.Add( VK_DOWN);    wnKeyCode.Add( VK_END);     wnKeyCode.Add( VK_RETURN);
	wnKeyCode.Add( VK_ESCAPE);  wnKeyCode.Add( VK_ESCAPE);  wnKeyCode.Add( VK_F1);      wnKeyCode.Add( VK_F2);
	wnKeyCode.Add( VK_F3);      wnKeyCode.Add( VK_F4);      wnKeyCode.Add( VK_F5);      wnKeyCode.Add( VK_F6);
	wnKeyCode.Add( VK_F7);      wnKeyCode.Add( VK_F8);      wnKeyCode.Add( VK_F9);      wnKeyCode.Add( VK_F10);
	wnKeyCode.Add( VK_F11);     wnKeyCode.Add( VK_F12);     wnKeyCode.Add( VK_HOME);    wnKeyCode.Add( VK_INSERT);
	wnKeyCode.Add( VK_INSERT);  wnKeyCode.Add( VK_LEFT);    wnKeyCode.Add( VK_NEXT);    wnKeyCode.Add( VK_PRIOR);
	wnKeyCode.Add( VK_RIGHT);   wnKeyCode.Add( VK_SPACE);   wnKeyCode.Add( VK_TAB);     wnKeyCode.Add( VK_UP);
	wnKeyCode.Add( VK_SNAPSHOT);wnKeyCode.Add( VK_LWIN);    wnKeyCode.Add( VK_RWIN);    wnKeyCode.Add( VK_SCROLL);
	wnKeyCode.Add( VK_NUMLOCK); wnKeyCode.Add( VK_CANCEL);  wnKeyCode.Add( VK_PAUSE);   wnKeyCode.Add( VK_CAPITAL);
	wnKeyCode.Add( VK_NUMPAD0); wnKeyCode.Add( VK_NUMPAD1); wnKeyCode.Add( VK_NUMPAD2); wnKeyCode.Add( VK_NUMPAD3);
	wnKeyCode.Add( VK_NUMPAD4); wnKeyCode.Add( VK_NUMPAD5); wnKeyCode.Add( VK_NUMPAD6); wnKeyCode.Add( VK_NUMPAD7);
	wnKeyCode.Add( VK_NUMPAD8); wnKeyCode.Add( VK_NUMPAD9); wnKeyCode.Add( VK_MULTIPLY);wnKeyCode.Add( VK_ADD);
	wnKeyCode.Add( VK_SUBTRACT);wnKeyCode.Add( VK_DECIMAL); wnKeyCode.Add( VK_DIVIDE);  wnKeyCode.Add( VK_APPS);
	wnKeyCode.Add( VK_LCONTROL);wnKeyCode.Add( VK_RCONTROL);wnKeyCode.Add( VK_LMENU);   wnKeyCode.Add( VK_RMENU);
	wnKeyCode.Add( VK_LSHIFT);  wnKeyCode.Add( VK_RSHIFT);  wnKeyCode.Add( VK_SLEEP);   wnKeyCode.Add( NUMPADENTER);
    wnKeyCode.Add( CTRLDOWN);   wnKeyCode.Add( CTRLUP);	    wnKeyCode.Add( ALTDOWN);    wnKeyCode.Add( ALTUP);
    wnKeyCode.Add( SHIFTDOWN);  wnKeyCode.Add( SHIFTUP);    wnKeyCode.Add( ASC);        wnKeyCode.Add( WAIT);
    wnKeyCode.Add( VK_LBUTTON); wnKeyCode.Add( VK_MBUTTON); wnKeyCode.Add( VK_RBUTTON);
    wnKeyCode.Add( VK_SHIFT);   wnKeyCode.Add( VK_MENU);    wnKeyCode.Add( VK_CONTROL);

    #ifdef LOGGING
	int wnKeyCodeEntryCount = wnKeyCode.GetCount();
     if ( ( wsCmtTableEntryCount != wnMacTypeEntryCount )
        || (wsCmtTableEntryCount != wnKeyCodeEntryCount) )
        wxMessageBox( wxT("KeyTables:Key tables entry counts mis-matched"),wxT("ERROR") );
    #endif //LOGGING

    m_KeyTableEntryCount = wsCmtTableEntryCount;

    //(pecan 2006/11/17)
    // Extended Key; KEYEVENTF_EXTENDEDKEY; Keys preceeded by 0xE0
    wnExtendedKeys.Add(VK_NEXT);  wnExtendedKeys.Add(VK_LEFT);  wnExtendedKeys.Add(VK_RIGHT); wnExtendedKeys.Add(VK_HOME);
    wnExtendedKeys.Add(VK_INSERT);wnExtendedKeys.Add(VK_DELETE);wnExtendedKeys.Add(VK_END);   wnExtendedKeys.Add(VK_DOWN);
    wnExtendedKeys.Add(VK_UP);    wnExtendedKeys.Add(VK_PRIOR); wnExtendedKeys.Add(VK_DIVIDE);wnExtendedKeys.Add(VK_APPS);
    wnExtendedKeys.Add(VK_RMENU); wnExtendedKeys.Add(VK_RCONTROL);

}// wsKeyTable()
#endif //(__WXMSW__)

// ----------------------------------------------------------------------------


